import axios, { AxiosRequestConfig, AxiosResponse } from "axios";
import router from "../plugins/router";
import { TUser } from "@/types";

// 请求拦截
axios.interceptors.request.use(
  (config: AxiosRequestConfig): AxiosRequestConfig => {
    // TODO: 抓取token-可优化为状态管理来取
    let user: TUser = window.localStorage.getItem("user");
    user = user ? JSON.parse(user) : "";
    // 携带请求头
    // read: ts语法: 可选的用法`?`(存在即访问,不存在不报错)
    config.headers = { token: user?.token };
    // 显示loading效果...
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// 响应拦截
axios.interceptors.response.use(
  (response: AxiosResponse<any>): AxiosResponse<any> => {
    if (
      response.data.code === 500 &&
      !router.currentRoute.fullPath.includes("/login")
    ) {
      // 保留当前地址,并跳转到login,登陆成功后跳回保留的页面
      router.push({
        name: "Login",
        query: {
          old: router.currentRoute.fullPath,
        },
      });
    }
    // 关闭loading效果...
    return response;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// 对外暴露
// 绑定到了window上后,一定要在main.js引入<这个文件才会生效-才能直接访问window.axios>
window.axios = axios;
/*不能直接放在window上(
  需要定义全局<declare global>的类型
)*/
export default axios;
